home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The CICA Windows Explosion!
/
The CICA Windows Explosion! - Disc 2.iso
/
programr
/
upc12bs1.zip
/
UUCICO
/
dcplib.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-09-29
|
17KB
|
439 lines
/*--------------------------------------------------------------------*/
/* d c p l i b . c */
/* */
/* DCP system-dependent library */
/* */
/* Services provided by dcplib.c: */
/* */
/* - login */
/* - UNIX commands simulation */
/*--------------------------------------------------------------------*/
/*--------------------------------------------------------------------*/
/* Changes Copyright (c) 1989-1993 by Kendra Electronic */
/* Wonderworks. */
/* */
/* All rights reserved except those explicitly granted by the */
/* UUPC/extended license agreement. */
/*--------------------------------------------------------------------*/
/*--------------------------------------------------------------------*/
/* Copyright (c) Richard H. Lamb 1985, 1986, 1987 */
/* Changes Copyright (c) Stuart Lynne 1987 */
/*--------------------------------------------------------------------*/
/*
* $Id: dcplib.c 1.7 1993/09/29 04:52:03 ahd Exp $
*
* $Log: dcplib.c $
* Revision 1.7 1993/09/29 04:52:03 ahd
* Make device name use standard modem file configuration prefix
*
* Revision 1.6 1993/09/20 04:48:25 ahd
* TCP/IP support from Dave Watt
* 't' protocol support
* OS/2 2.x support (BC++ 1.0 for OS/2)
*
* Revision 1.5 1993/07/24 03:40:55 ahd
* Correct #ifif to #ifel
*
* Revision 1.4 1993/07/22 23:22:27 ahd
* First pass at changes for Robert Denny's Windows 3.1 support
*
* Revision 1.3 1993/05/30 00:01:47 ahd
* Multiple commuications drivers support
*
*
* Updated:
*
* 14May89 - Added system name to login prompt - ahd
* Added configuration file controlled user id, password
* Added Kermit server option
* 17May89 - Redo login processing to time out after five minutes;
* after all, we have to exit someday. ahd
* 22Sep89 - Add password file processing ahd
* 24Sep89 - Modify login() to issue only one wait command for up
* to 32K seconds; this cuts down LOGFILE clutter. ahd
* 01Oct89 - Re-do function headers to allow copying for function
* prototypes in ulib.h ahd
* 17Jan90 - Filter unprintable characters from logged userid and
* password to prevent premature end of file. ahd
* 18Jan90 - Alter processing of alternate shells to directly
* invoke program instead of using system() call. ahd
* 6 Sep 90 - Change logging of line data to printable ahd
* 8 Sep 90 - Split ulib.c into dcplib.c and ulib.c ahd
* 8 Oct 90 - Break rmail.com and rnews.com out of uuio
* Add FIXED_SPEED option for no-autobauding ahd
* 10Nov 90 - Move sleep call into ssleep and rename ahd
*/
/*--------------------------------------------------------------------*/
/* System include files */
/*--------------------------------------------------------------------*/
#include <ctype.h>
#include <direct.h>
#include <dos.h>
#include <process.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <time.h>
#ifdef __TURBOC__
#include <sys/timeb.h>
#endif
#if defined(_Windows)
#include <windows.h>
#endif
/*--------------------------------------------------------------------*/
/* UUPC/extended include files */
/*--------------------------------------------------------------------*/
#include "lib.h"
#include "arpadate.h"
#include "dcp.h"
#include "dcplib.h"
#include "dcpsys.h"
#include "hlib.h"
#include "hostable.h"
#include "import.h"
#include "modem.h"
#include "pushpop.h"
#include "security.h"
#include "ssleep.h"
#include "commlib.h"
#include "usertabl.h"
#include "timestmp.h"
/*--------------------------------------------------------------------*/
/* Define current file name for panic() and printerr() */
/*--------------------------------------------------------------------*/
#if !defined(_Windows)
currentfile();
#endif
/*--------------------------------------------------------------------*/
/* Internal function prototypes */
/*--------------------------------------------------------------------*/
static void LoginShell( const struct UserTable *userp );
void motd( const char *fname, char *buf, const int bufsiz );
/*--------------------------------------------------------------------*/
/* l o g i n */
/* */
/* Login handler */
/*--------------------------------------------------------------------*/
boolean login(void)
{
char line[BUFSIZ]; /* Allow for long domain names! */
char user[50];
char pswd[50];
char attempts = 0; /* Allows login tries */
char *token; /* Pointer to returned token */
struct UserTable *userp;
#if defined(_Windows)
WORD wVersion;
#endif
if ( E_banner != NULL )
motd( E_banner, line, sizeof line );
/*--------------------------------------------------------------------*/
/* Our modem is now connected. Begin actual login processing */
/* by displaying a banner. */
/*--------------------------------------------------------------------*/
#if defined(_Windows)
wVersion = LOWORD(GetVersion());
sprintf(line, "\r\n\nMS-Windows(TM) %d.%02d with %s %s (%s) (%s)\r\n",
(WORD)(LOBYTE(wVersion)),
(WORD)(HIBYTE(wVersion)),
compilep,
compilev,
E_domain,
M_device); // Print a hello message
#else /* not Windows */
sprintf(line,"\r\n\n%s %d.%02d with %s %s (%s) (%s)\r\n",
#ifdef WIN32
"Windows NT(TM)",
_winmajor,
_winminor,
#elif defined(__OS2__)
"OS/2(R)",
(int) _osmajor / 10,
_osminor,
#elif defined( __TURBOC__ )
"MS-DOS(R)",
_osmajor,
_osminor,
#else
(_osmode == DOS_MODE) ? "DOS" : "OS/2(R)" ,
(_osmode == DOS_MODE) ? (int) _osmajor : ((int) _osmajor / 10 ),
_osminor,
#endif
compilep,
compilev,
E_domain,
M_device); /* Print a hello message */
#endif
wmsg(line,0);
ddelay(250);
/*--------------------------------------------------------------------*/
/* Display a login prompt until we get a printable character or */
/* the login times out */
/*--------------------------------------------------------------------*/
for ( attempts = 0; attempts < 5 ; attempts++ )
{
boolean invalid = TRUE;
while (invalid) /* Spin for a user id or timeout */
{
wmsg("\r\nlogin: ", 0);
strcpy(user,"");
if (rmsg(user, 2, 30, sizeof user) == TIMEOUT)
/* Did the user enter data? */
return FALSE; /* No --> Give up */
if (equal(user,"NO CARRIER"))
return FALSE;
token = user;
while ((*token != '\0') && invalid) /* Ignore empty lines */
invalid = ! isgraph(*token++);
} /* while */
printmsg(14, "login: login=%s", user);
/*--------------------------------------------------------------------*/
/* We have a user id, now get a password */
/*--------------------------------------------------------------------*/
wmsg("\r\nPassword: ", 0);
strcpy(pswd,"");
if (rmsg(pswd, 0, 30, sizeof pswd) == TIMEOUT)
return FALSE;
/*--------------------------------------------------------------------*/
/* Zap unprintable characters before we log the password */
/*--------------------------------------------------------------------*/
printmsg(14, "login: password=%s", pswd);
/*--------------------------------------------------------------------*/
/* Validate the user id and passowrd */
/*--------------------------------------------------------------------*/
userp = checkuser(user); /* Locate user id in host table */
if (userp == BADUSER) /* Does user id exist? */
{ /* No --> Notify the user */
wmsg("\r\nlogin failed",0);
token = user;
while (!isalnum( *token ) && (*token != '\0'))
token ++; /* Scan for first alpha-numeric */
if (*token != '\0') /* If at least one good char */
printmsg(0,"login: login for user %s failed, bad user id",
user); /* Log the error for ourselves */
}
else if ( equal(pswd,userp->password)) /* Correct password? */
{ /* Yes --> Log the user "in" */
/* . . ..+....1.... +....2....+....3.... + . */
sprintf(line,"\r\n\nWelcome to %s; login complete at %s\r\n",
E_domain, arpadate());
wmsg(line, 0);
printmsg(0,"login: login user %s (%s) at %s",
userp->uid, userp->realname, arpadate());
if equal(userp->sh,UUCPSHELL) /* Standard uucp shell? */
{
securep = userp->hsecure;
printmsg(5,"Processing user via %s", UUCPSHELL);
return TRUE; /* Yes --> Startup the machine */
}
else { /* No --> run special shell */
if ( E_motd != NULL )
motd( E_motd, line, sizeof line );
LoginShell( userp );
return FALSE; /* Hang up phone and exit */
}
}
else { /* Password was wrong. Report */
wmsg("\r\nlogin failed",0);
printmsg(0,"login: login user %s (%s) failed, bad password %s",
userp->uid, userp->realname, pswd);
}
} /* for */
/*-----------------------------------------------------------------*/
/* If we fall through the loop, we have an excessive number of */
/* login attempts; hangup the telephone and try again. */
/*-----------------------------------------------------------------*/
return FALSE; /* Exit processing */
} /*login*/
/*--------------------------------------------------------------------*/
/* l o g i n b y p a s s */
/* */
/* Initialize user setup when login is bypassed */
/*--------------------------------------------------------------------*/
boolean loginbypass(const char *user)
{
struct UserTable *userp;
char line[BUFSIZ]; /* Allow for long domain names! */
printmsg(14, "loginbypass: login=%s", user);
/*--------------------------------------------------------------------*/
/* Validate the user id */
/*--------------------------------------------------------------------*/
userp = checkuser(user); /* Locate user id in host table */
if (userp == BADUSER) /* Does user id exist? */
{ /* No --> Notify the user */
wmsg("\r\nUUCICO login failed",0);
printmsg(0,"loginbypass: login for user %s failed, bad user id",
user); /* Log the error for ourselves */
return FALSE; /* Hang up phone and exit */
}
else {
/* Yes --> Log the user "in" */
/* . . ..+....1.... +....2....+....3.... + . */
sprintf(line,"\r\n\nWelcome to %s; login complete at %s\r\n",
E_domain, arpadate());
wmsg(line, 0);
printmsg(0,"loginbypass: login user %s (%s) at %s",
userp->uid, userp->realname, arpadate());
if equal(userp->sh,UUCPSHELL) /* Standard uucp shell? */
{
securep = userp->hsecure;
return TRUE; /* Yes --> Startup the machine */
} /* if equal(userp->sh,UUCPSHELL) */
else { /* No --> run special shell */
LoginShell( userp );
return FALSE; /* Hang up phone and exit */
} /* else */
} /* else */
} /*loginbypass*/
/*--------------------------------------------------------------------*/
/* L o g i n S h e l l */
/* */
/* Execute a non-default remote user shell */
/*--------------------------------------------------------------------*/
static void LoginShell( const struct UserTable *userp )
{
#if defined(_Windows)
char line[128];
//
// No special shell support under Windows, sorry!
//
sprintf(line,
"login: special shell %s not supported. Goodbye.\r\n",
userp->sh);
wmsg(line, 0);
printmsg(0, "Login with special shell %s, not supported.", userp->sh);
return;
#else
char *shellstring;
char *path;
char *args;
int rc;
/*--------------------------------------------------------------------*/
/* Get the program to run and its arguments */
/*--------------------------------------------------------------------*/
shellstring = strdup(userp->sh);
/* Copy user shell for parsing */
path = strtok(shellstring," \t"); /* Get program name */
args = strtok(NULL,""); /* Get rest of arg string */
printmsg(1,"LoginShell: Invoking %s in directory %s",
userp->sh, userp->homedir);
ddelay(250); /* Wait for port to stablize */
/*--------------------------------------------------------------------*/
/* Run the requested program in the user's home directory */
/*--------------------------------------------------------------------*/
PushDir(userp->homedir);/* Switch to user's home dir */
if (args == NULL)
rc = spawnl(P_WAIT, path, path, NULL);
else
rc = spawnl(P_WAIT, path, path, args, NULL);
PopDir(); /* Return to original directory */
/*--------------------------------------------------------------------*/
/* Report any errors we found */
/*--------------------------------------------------------------------*/
if ( rc < 0 ) /* Error condition? */
{ /* Yes --> Report it to the user */
printmsg(0,"LoginShell: Unable to execute user shell");
printerr(path);
}
else /* No --> Report normal result */
printmsg(rc == 0 ? 4 : 0,"LoginShell: %s return code is %d",
path,
rc);
#endif
} /* LoginShell */
/*--------------------------------------------------------------------*/
/* m o t d */
/* */
/* Display a message of the day to the remote login */
/*--------------------------------------------------------------------*/
void motd( const char *fname, char *buf, const int bufsiz )
{
FILE *stream = FOPEN( fname, "r", BINARY_MODE ); /* Leave CRLF in data */
if ( stream == NULL )
{
perror( fname );
wmsg( fname,0 );
wmsg( ": ", 0);
wmsg( strerror( errno ),0);
wmsg( "\n\r",0);
return;
} /* if ( stream == NULL ) */
while( fgets( buf, bufsiz, stream ) != NULL )
wmsg( buf, 0 );
fclose( stream );
} /* motd */